﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>ComObjType()</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../css/default.css" rel="stylesheet" type="text/css">
</head>
<body>

<h1>ComObjType() <span class="ver">[v1.0.91+]</span></h1>

<p>从 COM 对象获取类型信息.</p>

<pre class="Syntax">VarType := ComObjType(ComObject)
Name    := ComObjType(ComObject, "Name")
IID     := ComObjType(ComObject, "IID")</pre>

<h3>参数</h3>
<table class="info">
  <tr>
    <td>ComObject</td>
    <td>包含 COM 对象或 typed value 的包装器对象.</td>
  </tr>
  <tr>
    <td>VarType</td>
    <td>表示值类型的整数.参见下面.</td>
  </tr>
  <tr>
    <td>Name</td>
    <td>接口类型名.</td>
  </tr>
  <tr>
    <td>IID</td>
    <td>表示接口类型的全局唯一标识符 (GUID).</td>
  </tr>
</table>

<h3>返回值</h3>
<p>如果省略第二个参数, 则返回包装器对象包含的值的变量类型.</p>
<p>如果第二个参数为 &quot;Name&quot; 或 &quot;IID&quot; 并且包装器对象包含 COM 对象 (变量类型 VT_DISPATCH), 则返回 COM 对象的类型名或其主接口的标识符.</p>
<p>如果参数都无效或发生了错误, 则返回空字符串.</p>

<h3 id="vt">变量类型的常量</h3>
<pre>
VT_EMPTY     =      0  <em>; 没有值</em>
VT_NULL      =      1  <em>; SQL 风格的空值</em>
VT_I2        =      2  <em>; 16 位有符号整数</em>
VT_I4        =      3  <em>; 32 位有符号整数</em>
VT_R4        =      4  <em>; 32 位浮点数</em>
VT_R8        =      5  <em>; 64 位浮点数</em>
VT_CY        =      6  <em>; 通用</em>
VT_DATE      =      7  <em>; 日期</em>
VT_BSTR      =      8  <em>; COM 字符串 (带有长度前缀的 Unicode)</em>
VT_DISPATCH  =      9  <em>; COM 对象 </em>
VT_ERROR     =    0xA  <em>; 错误码 (32 位整数)</em>
VT_BOOL      =    0xB  <em>; 布尔值真 (-1) 或假 (0)</em>
VT_VARIANT   =    0xC  <em>; <a href="http://msdn.microsoft.com/en-us/library/ms221627.aspx">VARIANT</a> (必须与 VT_ARRAY 或 VT_BYREF 组合使用)</em>
VT_UNKNOWN   =    0xD  <em>; IUnknown 接口指针</em>
VT_DECIMAL   =    0xE  <em>; (不支持)</em>
VT_I1        =   0x10  <em>; 8 位有符号整数</em>
VT_UI1       =   0x11  <em>; 8 位无符号整数</em>
VT_UI2       =   0x12  <em>; 16 位无符号整数</em>
VT_UI4       =   0x13  <em>; 32 位无符号整数</em>
VT_I8        =   0x14  <em>; 64 位有符号整数</em>
VT_UI8       =   0x15  <em>; 64 位无符号整数</em>
VT_INT       =   0x16  <em>; 有符号机器整数</em>
VT_UINT      =   0x17  <em>; 无符号机器整数</em>
VT_RECORD    =   0x24  <em>; 用户定义类型</em>
VT_ARRAY     = 0x2000  <em>; <a href="http://msdn.microsoft.com/en-us/library/ms221482.aspx">SAFEARRAY</a></em>
VT_BYREF     = 0x4000  <em>; 到另一种值类型的指针</em>
<em>/*
 VT_ARRAY 和 VT_BYREF 与另一个值组合在一起 (使用按位 OR)
 以指定准确的类型.例如, 0x2003 标识 32 位有符号整数的 <a href="http://msdn.microsoft.com/en-us/library/ms221482.aspx">SAFEARRAY</a>
 而 0x400C 标识到 <a href="http://msdn.microsoft.com/en-us/library/ms221627.aspx">VARIANT</a> 的指针.*/</em>
</pre>

<h3>一般说明</h3>
<p>在通常情况下, COM 对象的方法或属性的返回值会被转换成 AutoHotkey 支持的适合的数据类型.没有明确处理的类型通过 <a href="http://msdn.microsoft.com/en-us/library/ms221258.aspx">VariantChangeType</a> 强制转换成字符串; 如果转换失败或变量类型包含 VT_ARRAY 或 VT_BYREF 标志, 则返回同时包含值和其类型的对象代替.</p>
<p>对于任意变量 <i>x</i>, 如果 <code>ComObjType(x)</code> 返回整数, 则 <i>x</i> 包含 COM 对象包装器.</p>


<h3>相关</h3>
<p><a href="ComObjValue.htm">ComObjValue</a>, <a href="ComObjCreate.htm">ComObjCreate</a>, <a href="ComObjGet.htm">ComObjGet</a>, <a href="ComObjActive.htm">ComObjActive</a></p>

<h3>示例</h3>
<pre class="NoIndent">
d := <a href="ComObjCreate.htm">ComObjCreate</a>("Scripting.Dictionary")
VarType := ComObjType(d)          <em>; 对于可脚本化对象总为 9.</em>
Name    := ComObjType(d, "Name")  <em>; 仅对于可脚本化对象有效.</em>
IID     := ComObjType(d, "IID")   <em>; 同上.</em>
MsgBox Variant type:`t%VarType%`nType name:`t%Name%`nInterface ID:`t%IID%
</pre>

</body>
</html>
